package com.jf.spring.aop;

/**
 * Created with IntelliJ IDEA
 * Description:
 * User:22954
 * Date:2024-10-24
 * Time:20:24
 */
public class AOP {
    /*
    AOP----AspectOrient Programming 面向切面编程
    注释注入
        1.定义切面注入类  需用@Aspect注释
        2.定义切面方法  方法需注释@Annotation(value = "切入表达式", returning = "返回变量", throwing = "抛出变量名")
            例 @Before(value = "execution(public void Cat.eat()")
               public void doBefore(JoinPoint joinPoint) {}
    切面注释详细:
        1.切面注释包括  @Before @AfterReturning @AfterThrowing @After @Around
        2.切面注释切入点
            @Before  切面于方法执行前
            @AfterReturning  切面于成功执行方法后
            @AfterThrowing  切面于方法抛出异常后
            @After  切面于所有执行后
            @Around  一个切面方法完成以上所有切入点
        3.切入表达式
            1.完整表达式 execution(权限修饰符 返回值类型 类名/全路径类名.方法名([参数类型列表]))
            2.模糊表达式
                切入类/接口的符合方法名的所有重载方法 execution(权限修饰符 返回值类型 类名/全路径类名.方法名(..))
                切入类/接口的符合方法名,且第一个参数为int类型的所有重载方法 execution(权限修饰符 返回值类型 类名/全路径类名.方法名(int, ..))
                切入类/接口的符合权限修饰符的所有方法 execution(权限修饰符 * 类名/全路径类名.*(..))
                切入类/接口的所有方法 execution(* 类名/全路径类名.*(..))
                切入所有类/接口的所有方法 execution(* *.*(..))
            3.切入表达式可以通过 && || ! 等操作符结合起来
                例 @Before(value = "execution(* *.add(int,int)) || execution(* *.sub(int,int))")
            4.类名和全路径类名
                若切面类和目标类在同一包下,可以用类名代替全路径类名
        4.仅@AfterReturning可以配置returning = "返回变量名", @AfterThrowing可以配置throwing = "抛出变量名", 且配置变量名需与切面方法变量参数名相同
        5.对接口方法的切入,会对所有接口实现方法切入
        6.切入表达式可以复用
                @Pointcut(value = "ReusingExpression")
                public void ReusingMethod(){}

                @Before(value = "ReusingMethod")
                public void doBefore(JoinPoint joinPoint) {}

    多个切面类作用与同一方法
        @Order(order)注释定义切面类的执行优先级,order值越小,优先级越高
        执行顺序
            高优先级@Before -> 低优先级@Before -> 执行方法 -> 低优先级@AfterReturning | @AfterThrowing / @After -> 高优先级@AfterReturning | @AfterThrowing / @After

    注意
        1.切面注入类在IOC容器内以Proxy代理存储,取出的为代理对象,但实际运行内存也开辟空间
        2.切面注入类可以是实现接口的类,也可以是基类
            若注入类为接口实现类,取出时要以接口方式接收并代理
            若注入类为基类
                1.Spring只会代理父类,同时代理该父类的所有子类
                2.若代理类无子类,Spring会为其自动创建一个子类
        3.切面注入也可以xml配置
     */
}
